在 CTF 的 Reverse / Pwn 題裡,會常常碰到要讀懂一小段 assembly 才能找到 flag 或漏洞。學會看組合語言、認識寄存器與 calling convention,就能在很多題目裡快攻破點關鍵。
rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, rip 等。eax, ebx...)。r0-r12 / x0-x30。在做題前先確認 binary 的架構:file ./binary
cmp / test + je/jne/jg/jl —— 通常是驗證邏輯mov 把結果放到某個地方mov [rbp-0x20], rax、mov al, [rdi] —— 對應到 buffer/字串讀寫,找 buffer overflow 點或字串比較。objdump -s -j .rodata 可查看。mov dst, src:複製/讀寫。lea reg, [mem]:load effective addresspush/pop:stack 操作。call / ret:函式呼叫/返回。cmp a,b / test a,b:比較 / 檢查 0。je/jne/jg/jl/ja/jb:條件跳轉(根據 flags)。xor reg, reg:清零或 XOR;常見 xor rax, rax。inc/dec:+1 / -1。add/sub:加減。這題給了一個反組譯程式問輸入0x2e0會回傳什麼
asm1:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: cmp DWORD PTR [ebp+0x8],0x3fb
<+10>: jg 0x512 <asm1+37>
<+12>: cmp DWORD PTR [ebp+0x8],0x280
<+19>: jne 0x50a <asm1+29>
<+21>: mov eax,DWORD PTR [ebp+0x8]
<+24>: add eax,0xa
<+27>: jmp 0x529 <asm1+60>
<+29>: mov eax,DWORD PTR [ebp+0x8]
<+32>: sub eax,0xa
<+35>: jmp 0x529 <asm1+60>
<+37>: cmp DWORD PTR [ebp+0x8],0x559
<+44>: jne 0x523 <asm1+54>
<+46>: mov eax,DWORD PTR [ebp+0x8]
<+49>: sub eax,0xa
<+52>: jmp 0x529 <asm1+60>
<+54>: mov eax,DWORD PTR [ebp+0x8]
<+57>: add eax,0xa
<+60>: pop ebp
<+61>: ret
我們順著程式邏輯看下去
<+10>會判斷是否>0x3fb,答案為否所以不跳轉<+19>會判斷是否不=0x280,答案為是,所以跳轉到<+29><+29> eax = 0x2e0<+32> eax = eax - 0xa = 0x2d6,然後跳到<+60>
所以最後回傳的就是eax的值就是0x2d6
以上就是今天的內容啦
想看更多,記得明天再來喔~